﻿using System;
using System.Data;
using System.Data.Common;

namespace Vbyte.SharpOrm.SqlDb
{
    /// <summary>
    /// 特定数据库实体辅助接口实现
    /// </summary>
    public interface ISqlDb : IDisposable
    {
        /// <summary>
        /// 数据库连接字符串
        /// </summary>
        string ConnectionString { get; set; }

        /// <summary>
        /// 获取或设置该实例上的数据库连接
        /// </summary>
        /// <value>数据库连接对象</value>
        DbConnection CurrentConnection { get; set; }

        #region 通用数据库操作

        /// <summary>
        /// 使用共享数据库连接获取满足条件查询的内容数据表
        /// </summary>
        /// <param name="sharedConn">共享数据库连接对象</param>
        /// <param name="cmd">数据获取操作命令</param>
        /// <returns>通过数据获取命令获取的内容数据表</returns>
        DataTable GetDataTable(DbConnection sharedConn, DbCommand cmd);

        /// <summary>
        /// 使用共享数据库连接获取满足条件查询的数据只读器
        /// </summary>
        /// <param name="sharedConn">共享数据库连接对象</param>
        /// <param name="cmd">数据获取操作命令</param>
        /// <returns>数据只读器</returns>
        DbDataReader GetDataReader(DbConnection sharedConn, DbCommand cmd);

        /// <summary>
        /// 执行cmd命令查询，并返回查询所返回的结果集中第一行的第一列。所有其他的列和行将被忽略。
        /// </summary>
        /// <param name="sharedConn">共享数据库连接对象</param>
        /// <param name="cmd">数据获取操作命令</param>
        /// <returns>第一行的第一列的值</returns>
        object GetScalar(DbConnection sharedConn, DbCommand cmd);

        /// <summary>
        /// 对连接对象执行 SQL 语句
        /// </summary>
        /// <param name="sharedConn">共享数据库连接对象</param>
        /// <param name="cmd">数据操作命令</param>
        /// <returns>受影响的行数</returns>
        int ExecuteNonQuery(DbConnection sharedConn, DbCommand cmd);

        #endregion

        #region 数据库操作
        /// <summary>
        /// 判定是否存在数据库
        /// </summary>
        /// <param name="dbname">数据库名或路径</param>
        /// <returns></returns>
        bool ExsitsDb(string dbname);

        /// <summary>
        /// 创建数据库
        /// </summary>
        /// <param name="dbname">数据库名或文件路径</param>
        void CreateDb(string dbname);

        /// <summary>
        /// 创建带密码的数据库(嵌入式数据库适用)
        /// </summary>
        /// <param name="dbname">数据库名或文件路径</param>
        /// <param name="dbpwd">数据库密码</param>
        void CreateDb(string dbname, string dbpwd);

        /// <summary>
        /// 删除数据库
        /// </summary>
        /// <param name="dbName">数据库名或路径</param>
        void DropDb(string dbName);
        #endregion

        #region 表操作
        /// <summary>
        /// 判定是否存在指定表名
        /// </summary>
        /// <param name="tabName">数据库表名</param>
        /// <returns></returns>
        bool ExistsTable(string tabName);
        /// <summary>
        /// 根据统一表定义创建表
        /// </summary>
        /// <param name="tabDefine">数据表定义</param>
        void CreateTable(SqlTable tabDefine);

        /// <summary>
        /// 删除数据库中的表
        /// </summary>
        /// <param name="tabName">数据库表名</param>
        void DropTable(string tabName);

        /// <summary>
        /// 对表的修改，执行原生的SQL语句
        /// </summary>
        /// <param name="NativeSql">原生的SQL语句</param>
        void AlterTable(string NativeSql);
        #endregion

        #region 列操作
        /// <summary>
        /// 判定是否存在指定的列名
        /// </summary>
        /// <param name="tabName">数据库表名</param>
        /// <param name="colName">数据表中的列名</param>
        /// <returns></returns>
        bool ExistsColumn(string tabName, string colName);

        /// <summary>
        /// 在指定表名中添加新的列
        /// </summary>
        /// <param name="tabName">数据库表名</param>
        /// <param name="column">数据列定义</param>
        void AddColumn(string tabName, SqlTableColumn column);

        /// <summary>
        /// 删除指定表名中的数据列
        /// </summary>
        /// <param name="tabName">数据库表名</param>
        /// <param name="colName">数据表中的列名</param>
        void DropColumn(string tabName, string colName);
        #endregion

    }

}
